객체 지향 프로그래밍
객체 지향 프로그래밍이란?
객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체
로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체란?
객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수
와 작업을 수행 할 메소드
를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.
객체지향 프로그래밍을 레고에 빗대 표현 할 수 있는데, 객체
가 레고의 조각이 될 것이고 레고의 조각을 조립해서 무언가를 만드는 방식이 객체지향 프로그래밍이라고 할 수 있다.
이미지 출처 : https://www.tibco.com/blog/2015/05/05/lego-learning-the-building-blocks-of-data-visualization/
이미지 출처 : https://www.wired.com/2016/12/heres-much-lego-brick-stepped-worth/
객체는 또한 레고 조각과도 비슷하게 여러군데에서 재사용 할 수 있는데 이는 부품화
와 재사용성
이라는 객체 지향 프로그래밍의 특징을 보여주기도 한다.
객체 지향 프로그래밍 언어
객체지향 프로그래밍을 지원하는 언어로는 C++ , C# , Java , Python , JavaScript , Ruby , Swift
등이 있다. 더 많은 언어를 알고 싶다면 객체 지향 언어를 참고해보자.
객체 지향 프로그래밍의 특징
객체 지향 프로그래밍은 크게 추상화
, 캡슐화
, 상속
, 다형성
의 네가지 특징을 가진다.
1. 추상화
- 객체에서 공통된 속성과 행위를 추출 하는 것
- 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
- 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것
이미지 출처 : https://velog.io/@nayeon/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-OOPObject-Oriented-Programming
아우디, 니싼, 볼보는 모두 '자동차'에 해당된다. 자동차라는 추상화 집합을 만들어두고 자동차들이 가진 공통적인 특징들을 만들어서 활용한다.
추상화가 왜 필요할까?
'현대'와 같은 다른 자동차 브랜드가 추가될 수도 있다. 이때 추상화로 '자동차'를 구현 해놓으면 다른 곳의 코드를 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다.
2. 캡슐화
- 데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함)
- 낮은 결합도를 유지할 수 있도록 설계하는 것
이미지 출처 : https://velog.io/@nayeon/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-OOPObject-Oriented-Programming
속성과 기능을 정의하는 변수와 메소드를 클래스라는 캡슐에 넣어서 분류하는 것으로 재활용이 원활하다는 장점이 있고 캡슐화를 통해서 정보은닉
을 활용 할 수도 있다. (접근제어자의 활용)
3. 상속
- 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말한다
- 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
상속을 하게 된다면 장단점이 존재하는데 이는 다음과 같다.
장점 | 단점 |
---|---|
- 재사용으로 인한 코드가 줄어든다 - 범용적인 사용이 가능하다 - 자료와 메서드의 자유로운 사용 및 추가가 가능하다 | - 상위 클래스의 변경이 어려워진다 - 불필요한 클래스가 증가할 수 있다 - 상속이 잘못 사용될 수 있다 |
4. 다형성
- 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석 될 수 있는 것
- 어떠한 요소에 여러 개념을 넣어 놓는 것
객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성이라는 특징을 갖게 된다.
오버라이딩 | 오버로딩 |
---|---|
상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것 | 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것 |
객체 지향 프로그래밍의 장단점
장점
- 클래스 단위로 모듈화시켜서 개발하기 때문에
업무 분담이 편리
하고대규모 소프트웨어 개발에 적합
하다. - 클래스 단위로 수정이 가능하기 때문에
유지 보수가 편리
하다. - 클래스를 재사용하거나 상속을 통해 확장함으로써
코드 재사용이 용이
하다.
단점
처리속도가 상대적으로 느리다
.- 객체의 수가 많아짐에 따라
용량이 커질 수 있다
. 설계시 많은 시간과 노력이 필요
하게 될 수 있다.
객체 지향 프로그래밍의 반대는 절차 지향 프로그래밍이다?
객체 지향 프로그래밍은 절차 지향 프로그래밍과 장단점이 겹치는 부분이 있기 때문에 그렇게 생각이 들 수 있다.
하지만 절차지향은 순차적으로 실행에 초점이 되어있고 객체지향은 관계/조직에 초점을 맞추고 있다는 초점의 차이일 뿐이다.
절차적 프로그래밍이라고 해서 객체를 다루지 않는 것이 아니고, 객체지향 프로그래밍이라고해서 절차가 없는 것도 아니다.
SOLID (객체 지향 설계 원칙)
객체 지향적으로 설계하기 위해 SOLID
라 불리는 다섯 가지 원칙이 있다.
1. 단일 책임 원칙 (SRP, Single Responsibility Principle)
- 하나의 클래스는 단 하나의 책임만 가져야 한다.
- 단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다.
2. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다.
3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)
- 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)
- 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
- 인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
- 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.
5. 의존관계 역전 원칙 (DIP), Dependency Inversion Principle)
- 추상화에 의존해야지 구체화에 의존하면 안된다.
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
면접에 나올 수 있는 질문
Q. 객체 지향 프로그래밍의 특징 네가지는?
A. 객체 지향 프로그래밍은
추상화
,캡슐화
,상속
,다형성
의 네가지 특징을 가진다.
Q. 객체 지향 프로그래밍을 사용하는 이유는?
A. 객체 지향 프로그래밍은 클래스와 인스턴스 단위로 개발을 진행하기 때문에
업무 분담의 편의
,유지 보수의 편리성
,코드 재사용 용이
등의 장점이 있기 때문에 객체 지향 프로그래밍을 사용한다.
Q. 정보은닉이란 무엇이고 어떤 장점이 있나요?
A. 정보 은닉은
캡슐화
를 함으로 얻을 수 있는 가장 중요한 장점으로, 다른 객체에게 자신의 정보를 숨기고 자신의 연산만을 통해서 접근을 허용하는 것이다.
외부 객체가 특정 객체의 데이터와 함수를 사용하거나 변경하지 못하므로유지보수
와 소프트웨어 확장 시오류를 최소화
할 수 있다는 장점이 있다.
Q. 객체지향 프로그래밍과 절차지향 프로그래밍의 차이는 무엇인가요?
A. 절차지향 프로그래밍은
프로그램의 실행 절차
에 중점을 둔 프로그래밍 방식이고 객체지향 프로그래밍은관계와 조직
에 중점을 둔 프로그래밍 방식이다.
Q. 객체지향 프로그래밍과 함수형 프로그래밍의 차이는 무엇인가요?
A. 객체지향 프로그래밍은
클래스
가 일급 객체가 되어 클래스와 객체 사이의 관계를 중심으로 코드 작성이 이루어지지만, 함수형 프로그래밍은함수
자체가 일급 객체가 되어 값의 연산 및 결과 도출을 중심으로 코드 작성이 이루어진다.
Q. 클래스 없이 개발하거나 하나의 클래스나 객체만으로 구성하는 것도 객체지향 프로그래밍이라고 할 수 있나요?
A. 객체 지향 프로그래밍은 클래스 단위로 개발하기 때문에 여러 장점을 갖게 되는데 클래스 없이 개발되는 것은 객체지향 적으로 프로그래밍을 설계 했다고 보기는 어렵다.
또한 오직 하나의 클래스나 객체로 프로그램을 설계했다면 SOLID 원칙이 지켜지지 않을 수 있기 때문에 SOLID 원칙을 지키며 설계하는 것이 바람직하다.
참고
- 객체 (컴퓨터 과학)
- 객체 지향 프로그래밍이란?
- [Python] 객체지향(Object Oriented Programming)의 이해
- 객체지향 프로그래밍
- 객체 지향 프로그래밍 (OOP::Object Oriented Programming)
- SOLID (객체 지향 설계)
기여자
Jongminfire
📦